#include <iostream>
#include <cstring>

using namespace std;
const int N=5*1e5+10;

int h[N],ne[N],to[N],idx;
int f[N][18];
int depth[N];
int cnt[N];
void add(int x,int y)
{
	to[idx]=y;
	ne[idx]=h[x];
	h[x]=idx++;
}
void dfs(int u,int fa)
{
	for(int i=h[u];~i;i=ne[i])
	{
		int j=to[i];
		if(j==fa || depth[j])
			continue;
		depth[j]=depth[u]+1;
		f[j][0]=u;
		for(int k=1;k<18;k++)
		{
			f[j][k]=f[f[j][k-1]][k-1];
		}
		dfs(j,u);
	}
}
int lca(int x,int y)
{
	if(depth[x]<depth[y])
	{
		swap(x,y);
	}
	for(int k=17;k>=0;k--)
	{
		if(depth[f[x][k]]>=depth[y])
		{
			x=f[x][k];
		}
	}
	if(x==y)
		return x;
	for(int k=17;k>=0;k--)
	{
		if(f[x][k]!=f[y][k])
		{
			x=f[x][k];
			y=f[y][k];
		}
	}
	return f[x][0];
}
int get_cnt(int u,int fa)
{
	for(int i=h[u];~i;i=ne[i])
	{
		int j=to[i];
		if(j==fa)
			continue;
		cnt[u]+=get_cnt(j,u);
	}		
	return cnt[u];
}
int main()
{
	int n,k;
	cin>>n>>k;
	memset(h,-1,sizeof(h));
	for(int i=1;i<n;i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		add(x,y);
		add(y,x);
	}
	dfs(1,0);
	for(int i=0;i<k;i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		int p=lca(x,y);

		cnt[x]++;
		cnt[y]++;	
		cnt[p]--;
		cnt[f[p][0]]--;
		
	}
	int ret=0;
	get_cnt(1,0);
	for(int i=1;i<=n;i++)
	{
		ret=max(ret,cnt[i]);
	}
	cout<<ret<<endl;
	return 0;
}
